package com.cxh.supermarket.common.utils;


import com.cxh.supermarket.common.exception.ServiceException;
import com.cxh.supermarket.common.function.BranchHandleFunction;
import com.cxh.supermarket.common.function.ExceptionFunction;
import com.cxh.supermarket.common.function.NullHandleFunction;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;

/**
 * 判断 工具类(函数式编程替代 if else)
 *
 * @author zlj
 * @since 2023/1/10
 */
@Slf4j
public class JudgeUtils {

  /**
   * 异常处理:  条件成立  抛异常
   *
   * @param b 判断条件
   * @return 抛异常, 并指定异常信息  com.huigu.common.function.ExceptionFunction
   */
  public static ExceptionFunction conditionException(Boolean b) {
    return (msg, errLag) -> {
      if (b) {
        JudgeUtils.conditionNull(errLag).notNullHandle(t -> log.error(errLag));
        JudgeUtils.conditionNull(msg).notNullHandle(t -> {
          throw new ServiceException(msg);
        });
      }
    };
  }

  /**
   * 分支处理:  根据条件分别执行逻辑
   *
   * @param b 判断条件
   * @return com.huigu.common.function.BranchHandleFunction
   */
  public static BranchHandleFunction conditionBranch(Boolean b) {
    return (trueBranch, falseBranch) -> {
      if (b) {
        trueBranch.run();
      } else {
        falseBranch.run();
      }
    };
  }

  /**
   * 判空处理:  判断对象是否为空/空字符串/空集合
   *
   * @param obj
   * @return
   */
  public static <T> NullHandleFunction<T> conditionNull(T obj) {
    return (notNull, isNull) -> {
      if (ObjectUtils.isEmpty(obj)) {
        isNull.accept(obj);
      } else {
        notNull.accept(obj);
      }
    };
  }
}
